#include "Laka.h"

using namespace std;
//konstruktor. wczytanie danych z pliku
Laka::Laka(string i, string o) {
	 odczytzapis = new OdczytZapis(i, o);
	 zwierzeta=odczytzapis-> wczytajDaneZPliku();
}

// symulacja czasu jaki ma uplynac
void Laka::symuluj(int ileM){
	
	for (int i=0; i<ileM; i++) {
		cout << i << endl;
		wykonajMiesiac(i);
	}
	
}
// czynnosci w ramach miesiaca
void Laka::wykonajMiesiac(int nrAktualMies) {
	wykonajKrzyzowanie(nrAktualMies);
//	ostatniaWieczerza();
//	usmiercNajslabszeOgniwa();
}

//zapis wynikow krzyzowania do pliku
void Laka::zapiszWyniki() {
	odczytzapis ->zapiszDaneDoPliku(zwierzeta);
}
//krzyzowanie zwierzat
void Laka::wykonajKrzyzowanie(int nrAktualMies) {
	ListaZwierzat noweZwierzeta;
		if (zwierzeta -> poczatek == NULL) {
			cout<<"Pusta lista"<<endl;
		} else {
			ElListy *tmp_wsk = zwierzeta -> poczatek;
			while (tmp_wsk != NULL) {
				Zwierze* aktualneZwierze = tmp_wsk->zwierze ; //aktualne zwierze pobieramy z listy 
//				cout << "Probujemy krzyzowac " << aktualneZwierze -> gatunek() << endl;
//				cout << "czy moze sie rozmnazac? " << (aktualneZwierze->czyMozeSieRozmn(nrAktualMies) ? "tak" : "nie") << endl;
				if (aktualneZwierze->czyMozeSieRozmn(nrAktualMies)) { //obliczanie miesiecy czy uplynal czas odpowiedni zwraca bool //luty grudzien
//				cout << "krzyzujemy " << aktualneZwierze->gatunek() << " i " << znajdzPartnera(aktualneZwierze, nrAktualMies)->gatunek() << endl;
					Zwierze *partner = znajdzPartnera(aktualneZwierze, nrAktualMies); 
					Zwierze* dziecko = aktualneZwierze->krzyzuj(partner); //zwraca nowe obiekty dzieci
					if (dziecko !=NULL) {
						dziecko -> nrMiesiacaGdyOstRozmn = nrAktualMies; //ustawia ostatni rozmnazany miesiac na ten co jest bo sie udalo;)
						noweZwierzeta += dziecko; //dodaje na koniec listy nowych zwirzat
					}
					
					aktualneZwierze -> nrMiesiacaGdyOstRozmn = nrAktualMies; // dlaaktualnego i partnera tez ustawia
					partner -> nrMiesiacaGdyOstRozmn = nrAktualMies;
					
				}
				tmp_wsk = tmp_wsk -> nast;
			}
		}
		
		(*zwierzeta) += &noweZwierzeta; // dokleja nowe zwierzeta do listy starych aby potem moc je brac pod uwage
}

Zwierze* Laka::znajdzPartnera(Zwierze* pierPolowka, int nrAktualMies) {
//				cout << "cszukamy partnera dla  " << pierPolowka->gatunek() << endl;
	if (zwierzeta -> poczatek == NULL) {
			cout<<"Pusta lista"<<endl;
		} else {
			ElListy *tmp_wsk = zwierzeta -> poczatek;
			while (tmp_wsk != NULL) {
				Zwierze* aktualneZwierze = tmp_wsk->zwierze ;
//				cout << "probujemy z: " << aktualneZwierze->gatunek() << endl;
//				cout << "czy moze? " << (aktualneZwierze->czyMozeSieRozmn(nrAktualMies) ? "tak" : "nie") << endl;
				if  (aktualneZwierze->czyMozeSieRozmn(nrAktualMies)) {
//				cout << "czy moze byc partnerem? " << (pierPolowka->czyMozeBycPartnerem(aktualneZwierze, nrAktualMies)  ? "tak" : "nie") << endl;
					if (pierPolowka->czyMozeBycPartnerem(aktualneZwierze, nrAktualMies)){// sprawdza czy moze sie rozmnazac i czy ten sam gatunek
						return aktualneZwierze;
					}
				}
				tmp_wsk = tmp_wsk -> nast;
			}
		}
		return NULL;
}





